# dce市场版、所内版、会员版巡检用例脚本
import time

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

desired_caps = {
    'platformName': 'Android',  # 被测手机是安卓
    'platformVersion': '12',  # 手机安卓版本
    'deviceName': 'xxx',  # 设备名，安卓手机可以随意填写
    'appPackage': 'com.dfitc.fip.anliang',  # 启动APP Package名称
    'appActivity': 'com.dlfc.android.smartinfo.ui.activity.StartActivity',  # 启动Activity名称
    'unicodeKeyboard': True,  # 使用自带输入法，输入中文时填True
    'resetKeyboard': True,  # 执行完程序恢复原来输入法
    'noReset': True,  # 不要重置App
    'newCommandTimeout': 6000,
    'automationName': 'UiAutomator2'
}
print("begin connect Appium Server,desired_caps is %s" % desired_caps)
# 连接Appium Server，初始化自动化环境
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
print("connect Appium Server success")

# -------变量区-------
# 行情第一次更新的状态
isFirstUpdate = False
# 已阅读按钮参考出现时长（从服务端连接成功到阅读按钮可视的时长）
CYCLE_CHECKED_APPEAR_DURATION = 5
# 首页遮罩出现时长
VIEW_GUIDE_APPEAR_DURATION = 3
# 加载框参考出现时长
LOADING_APPEAR_DURATION = 3
# 行情正常更新的参考超时时长,一分钟
QUOTE_UPDATE_DURATION = 10

# -------变量区-------

# step1 :如果出现已阅读和同意按钮，点击已阅读和同意按钮，否则跳过
try:
    WebDriverWait(driver, CYCLE_CHECKED_APPEAR_DURATION).until(
        EC.visibility_of_element_located((By.ID, "iv_cycle_checked")))
    driver.find_element(AppiumBy.ID, 'iv_cycle_checked').click()
    driver.find_element(AppiumBy.ID, 'confirm_btn').click()
    print("step1", "点击已阅读和同意按钮")
except TimeoutException as e:
    print("未找到已阅读和同意按钮，可能之前用户已经同意了")

# step2 :如果出现首页遮罩，点击让其消失，否则跳过
try:
    print("Wait visibility_of_element_located view_guide")
    WebDriverWait(driver, VIEW_GUIDE_APPEAR_DURATION).until(
        EC.visibility_of_element_located((By.ID, "view_guide")))
    print("return visibility_of_element_located view_guide")
    driver.tap([(540, 1080)], 300)
    print("step2", "轻敲首页窗口，让首页遮罩消失")
except TimeoutException as e:
    print("未找到首页遮罩")

# step3 :点击行情tab，跳转行情页
driver.find_elements(AppiumBy.ID, "ll_tab_container")[2].click()

# step4 :行情列表是否正常更新
# 各交易所期货
# 各交易所期权
# 大商所指数
# 财讯通套利
# 场外市场各版块及现货专区
# 主力排名

# step4.1
# 如果出现行情遮罩,点击让其消失
# todo
# driver.tap([(540, 1080)], 300)

# step4.2
# 切换行情列表，查看行情是否正常（
# 各交易所期货
# 各交易所期权
# 大商所指数
# 财讯通套利
# 场外市场各版块及现货专区
# 主力排名）
# step4.2.1
#  行情列表第一次加载时是否更新成功的判断：没有出现加载框或者加载框在设置的时间内消失

try:
    # 超时时长应等于加载框参考出现时长
    WebDriverWait(driver, LOADING_APPEAR_DURATION).until(
        EC.visibility_of_element_located((By.ID, "cus_loading")),
        "visibility_of_element cus_loading")
except TimeoutException as e:
    print("TimeoutException.msg is", e.msg)
    print("行情列表第一次加载时更新成功，无加载框")
    isFirstUpdate = True
else:
    try:
        # 超时时长应等于行情正常更新的参考超时时长
        WebDriverWait(driver, QUOTE_UPDATE_DURATION).until(
            EC.invisibility_of_element_located((By.ID, "cus_loading")),
            "invisibility_of_element_located cus_loading")
    except  TimeoutException as e:
        print("TimeoutException.msg", e.msg)
        print("行情列表第一次加载时更新失败")
    else:
        print("行情列表第一次加载时更新成功，有加载框")
        isFirstUpdate = True

# step4.2.2
# 行情列表加载成功后，数据是否更新成功的判断：
# 监视行情列表成交量的变化；成交量变化时，断言行情更新成功，否则超时，断言行情更新失败
if isFirstUpdate:
    try:
        WebDriverWait(driver, 1).until(
            EC.visibility_of_element_located((By.ID, "tv_dealCount")),
            "visibility_of_element_located tv_dealCount")
        waitCount = 10
        tvDealCountTextOld = driver.find_element(AppiumBy.ID, "tv_dealCount").text
        print("tvDealCountTextOld is", tvDealCountTextOld)
        isSecondUpdate = False
        while waitCount > 0:
            waitCount = waitCount - 1
            time.sleep(1)
            tvDealCountTextNew = driver.find_element(AppiumBy.ID, "tv_dealCount").text
            print("tvDealCountTextNew is", tvDealCountTextNew)
            if tvDealCountTextNew != tvDealCountTextOld:
                isSecondUpdate = True
                break
        print("行情列表第二次%s" % ("更新成功" if isSecondUpdate else "未更新"))
    except TimeoutException as e:
        print("TimeoutException.msg", e.msg)

# step4.3 -->todo airtest
# 跳转行情详情页，查看K线、分时是否正常显示
# step4.3.1 使用airtest的截屏函数：
# 截屏分时图，间隔10s后截取第二张
# 切换到K线模式，截屏K线图，间隔10s后截取第二张
# 在报告中对比前后分时图是否变化，K线图是否变化

# step5-->todo airtest
# 跳转实时统计页
# step5.1
# 查看实时统计数据，（交易所、品种、合约）是否正确
# step5.1.1
# 进入实时统计页，截屏期货分布柱状图，间隔10s后截取第二张
# 切换期权tab页，截屏期权占比柱状图，间隔10s后截取第二张
# 在报告中检查截图中的柱状图是否正常

# step5.2
# 查看实时统计数据，有无负值、极大值等异常数据
# step5.2.1
# 进入实时统计页，上滑页面至成交量列表可视
# 遍历成交量至持仓额的若干行数据，出现负值的数据，打印出来

# step6
# 跳转自选列表页
# step6.1
# 点击下方自选按钮，进入自选列表并展示自选合约
# step6.1.1
# 如果自选列表为空，进入搜索页，添加一个期货合约，返回自选列表，查看是否添加成功
# 是否添加成功的判断：判断合约名称文案是否出现在屏幕中
# api：appium.webdriver.webdriver.WebDriver.find_element();

# step7
# 跳转资讯tab页
# step7.1
# 切换不同资讯种类，并随机查看各类资讯。
# step7.1.1
# 点击第一个资讯种类tab，向上滚动列表一个屏幕，点击列表的某条资讯，进入详情页，判断详情页是否加载成功
# 判断详情页是否加载成功：判断资讯文案是否出现在屏幕中

# step8 -->todo airtest
#  跳转某个报表区页面
# 持仓排名、席位分析、期市速递、仓单日报等功能
# step8.1 进入持仓排名页
# step8.1.1 使用airtest的截屏函数截屏,间隔10s后截取第二张
# step8.1.2 切换tab，按照8.1.1步骤截图
# 在报告中查看


# step9
# 首页banner区：点击是否可以进入相关链接
# step10
# 点击首页公告、新闻进入详情界面
# step11
# 首页行情模块是否正常展示（所内版本无此区域）
# step12
# 首页所内版独有区域，数据展示是否都正常-->todo airtest
